package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.admin.mapper.ChannelMapper;
import com.heima.admin.service.ChannelService;
import com.heima.model.admin.dtos.ChannerDto;
import com.heima.model.admin.pojos.AdChannel;

import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import io.swagger.annotations.Api;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

@Api(value = "频道列表", tags = "频道列表", description = "根据名称查询频道列表")
@Service
public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, AdChannel> implements ChannelService {


    //使用ResponseResult，为的是统一返回参数类型
    @Override
    public ResponseResult getChannelListByName(ChannerDto dto) {
//        1、参数校验
        if (dto == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        dto.checkParam();
//        2、封装查询条件
        //根据名称模糊查询
        LambdaQueryWrapper<AdChannel> wrapper = Wrappers.lambdaQuery();
        if (StringUtils.isNotBlank(dto.getName())) {
            wrapper.like(AdChannel::getName, dto.getName());
        }
//        根据频道状态模糊查询
        if (dto.getStatus() != null) {
            wrapper.like(AdChannel::getStatus, dto.getStatus());
        }
        //升序排序根据编号
        wrapper.orderByAsc(AdChannel::getOrd);

        Page<AdChannel> page = new Page<>(dto.getPage(), dto.getSize());
        //执行查询条件

////        模拟查询过程中出现异常的情况
//        int i=3/0;
//        System.out.println(i);

        IPage<AdChannel> pages = this.page(page, wrapper);
//        3、返回查询结果

        PageResponseResult pageResponseResult = new PageResponseResult(dto.getPage(), dto.getSize(), pages.getTotal(), pages.getRecords());
        return pageResponseResult;

    }


    @Override
    public ResponseResult saveChannel(AdChannel channel) {
//        1、参数校验
        if (StringUtils.isBlank(channel.getName())) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "名称不能为空");
        }
        if (channel.getName().length() > 10) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "名称长度不能超过10");
        }

        int count = this.count(Wrappers.<AdChannel>lambdaQuery()
                .eq(AdChannel::getName, channel.getName()));
        if (count > 0) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "名称不能够跟已有的重复");
        }

//        2、保存频道信息
        channel.setCreatedTime(new Date());
        this.save(channel);
        return ResponseResult.okResult();

    }






    //    根据id修改频道信息
    @Override
    public ResponseResult updateByidAndName(AdChannel adChannel) {

//        1、校验参数
        if (adChannel == null || adChannel.getId() == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
//        2、校验id对应的频道是否存在
        AdChannel byId = this.getById(adChannel.getId());
        if (byId == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "修改的频道不存在数据库当中");
        }

//        3、检查修改的跟未修改的名称是否是重复的
        if (StringUtils.isNotBlank(adChannel.getName())
                &&
                !byId.getName().equals(adChannel.getName())){

//            判断现在修改的数据跟已经存在的数据是否是冲突的数据
          int count=this.count(Wrappers.<AdChannel>lambdaQuery()
                  .eq(AdChannel::getName, adChannel.getName()));
          if (count>0){
              return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE,"当前频道已经存在，请检查修改名称！");
          }
        }
        this.updateById(adChannel);
        return ResponseResult.okResult("修改频道数据成功！");


    }




    /**
     * 根据id删除频道
     */
    @Override
    public ResponseResult deleteByid(Integer id) {
//        1、参数校验合法性
        if (id == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
//        2、判断频道是否存在
        AdChannel channel = this.getById(id);
        if (channel == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }

//        3、判断频道的状态信息
        if (channel.getStatus()) {
//            状态正常的情况下不能够进行删除
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
//        4、进行delete
        removeById(id);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }


}
